package com.guoxue.action.front;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.guoxue.action.common.CreatePolicy;
import com.guoxue.action.common.GetServerIP;
import com.guoxue.action.common.SCSettingStaticName;
import com.guoxue.consts.SCUser;
import com.guoxue.domain.OSSAKVo;
import com.guoxue.domain.UserCoinsVo;
import com.guoxue.domain.UserToOSSAudioVo;
import com.guoxue.service.ICreateAKService;
import com.guoxue.service.IUserCoinsService;
import com.guoxue.service.IUserToOSSAudioService;
import com.guoxue.util.codeSwitch.khb;
import com.guoxue.util.codeSwitch.zt;
import com.guoxue.util.oss.ClientTokenConfig;

@Controller
public class OSSTokenAction extends BaseAction {
	@Resource
	private IUserCoinsService userCoinsService;
	@Resource
	private IUserToOSSAudioService userToOSSAudioService;
	@Resource
	private CreatePolicy createPolicy;
	@Resource
	private ICreateAKService createAKService;
	@Resource
	private ClientTokenConfig clientTokenConfig;
	
	/**
	 * 
	 * @param request
	 * @param response
	 * @param keyType 请求生成url地址的文件类型1.图片 2.音频
	 * @return
	 */
	@ResponseBody
	@RequestMapping(value = "/getTestInfo")
	public JSONObject A2_getToken(HttpServletRequest request, HttpServletResponse response){
		JSONObject result_json = new JSONObject();//返回的json定义
		result_json.put("code", "200");
		result_json.put("message", "test返回图片地址和音频地址");	
		result_json.put("image1","0016d50b203a1a869523b37232494435.png");
		result_json.put("image2","066b9a5df7fb2c670ac042ce21b4249c.png");
		result_json.put("audio1","03f0799c7615fd053d35c607ebd5635a.mp3");
		result_json.put("audio2","022ab6c37f3fcb8ef2aa6ee71844bcc9.mp3");
		return result_json;
	}
	/**
	 * 
	 * @param request
	 * @param response
	 * @param keyType 请求生成url地址的文件类型1.图片 2.音频
	 * @return
	 */
	@ResponseBody
	@RequestMapping(value = "/getTokenForUrl")
	public JSONObject A2_getToken_forUrl(HttpServletRequest request, HttpServletResponse response){
		JSONObject result_json = new JSONObject();//返回的json定义
		/*keyType=1返回取图片的临时AK,2返回取音频的临时AK,3返回取json的临时AK*/
	    int[] keyType= new int[]{1,2,3};
	    /*定义三个临时AK*/
	    OSSAKVo ossAk1=null;
	    OSSAKVo ossAk2=null;
	    OSSAKVo ossAk3=null;
	    List list =new ArrayList();
	    //获取当前的时间
        Long ownTime=System.currentTimeMillis()/1000;
		for(int i=0;i<keyType.length;i++){
			int type=keyType[i];
			if(type==1){
				String bucket=SCSettingStaticName.CLIENT_USERIMAGE_BUCKET;
				String localurl=SCSettingStaticName.CLIENT_USERIMAGE_LOCALURL;
				ossAk1=createAKService.getOSSAK("GET",type);
		        if(ossAk1==null){
		        	ossAk1=new OSSAKVo();
		        	ossAk1.setExpiration(ownTime);
		        }
		        if((ossAk1.getExpiration()-ownTime)<300){
		    		String policy=createPolicy.getPolicy("", bucket, SCSettingStaticName.EXPIRATION_TIME);
		    		String roleSessionName ="GET-URL-"+ownTime;
		    		ossAk1=clientTokenConfig.assumeRole(roleSessionName,bucket,policy,ossAk1,type,localurl);
		        }
		        list.add(ossAk1);
			}
			if(type==2){
				String bucket=SCSettingStaticName.CLIENT_USERAUDIO_BUCKET;
				String localurl=SCSettingStaticName.CLIENT_USERAUDIO_LOCALURL;
				ossAk2=createAKService.getOSSAK("GET",type);
		        if(ossAk2==null){
		        	ossAk2=new OSSAKVo();
		        	ossAk2.setExpiration(ownTime);
		        }
		        if((ossAk2.getExpiration()-ownTime)<300){
		    		String policy=createPolicy.getPolicy("", bucket, SCSettingStaticName.EXPIRATION_TIME);
		    		String roleSessionName ="GET-URL-"+ownTime;
		    		ossAk2=clientTokenConfig.assumeRole(roleSessionName,bucket,policy,ossAk2,type,localurl);
		        }
		        list.add(ossAk2);
			}
			if(type==3){
				String bucket=SCSettingStaticName.CLIENT_USERJSON_BUCKET;
				String localurl=SCSettingStaticName.CLIENT_USERJSON_LOCALURL;
				ossAk3=createAKService.getOSSAK("GET",type);
		        if(ossAk3==null){
		        	ossAk3=new OSSAKVo();
		        	ossAk3.setExpiration(ownTime);
		        }
		        if((ossAk3.getExpiration()-ownTime)<300){
		    		String policy=createPolicy.getPolicy("", bucket, SCSettingStaticName.EXPIRATION_TIME);
		    		String roleSessionName ="GET-URL-"+ownTime;
		    		ossAk3=clientTokenConfig.assumeRole(roleSessionName,bucket,policy,ossAk3,type,localurl);
		        }
		        list.add(ossAk3);
			}	
		}
		/*----------------判断该请求指向OSS上的哪个bucket---------------*/
        if(ossAk1==null||ossAk2==null||ossAk3==null){
        	result_json.put("code", "400");
			result_json.put("message", "获取token失败");	
			return result_json;
        }else{
        	JSONArray jsonArray = new JSONArray();
    		for(int i=0;i<list.size();i++){
    			OSSAKVo ossAk=(OSSAKVo)list.get(i);
	        	final JSONObject aliResponseJson = new JSONObject();
				aliResponseJson.put("AccessKeyId", ossAk.getAccessKeyId());
				aliResponseJson.put("AccessKeySecret", ossAk.getAccessKeySecret());
				aliResponseJson.put("SecurityToken", ossAk.getSecurityToken());
				aliResponseJson.put("Expiration", ossAk.getExpiration());
				aliResponseJson.put("bucket", bucket);
				aliResponseJson.put("keyType", ossAk.getKeyType());
				aliResponseJson.put("localUrl", ossAk.getLocalUrl());
				aliResponseJson.put("serverIP", GetServerIP.getLocalIP());
				jsonArray.add(aliResponseJson);
    		}
			result_json.put("data", jsonArray);
			result_json.put("code", "200");
			result_json.put("message", "获取token成功");
        }
		return result_json;
	}

	
	/**
	 * 用户准备上传录音,获取oss上传权限(允许客户端上传一个录音音频文件)
	 * 
	 * @param request
	 * @param response
	 * @param type
	 *            上传录音的类型(预留参数,目前总是传0)
	 * @param chapterId
	 *            录音的章节id(基础章节Id,而非计划章节Id)
	 * @param size
	 *            音频文件大小(单位:byte)
	 * @param duration
	 *            音频文件时长(单位:ms(毫秒))
	 * @param info
	 *            预留扩展参数,目前总是传""	 
	 * @param c_fileName
	 *            客户端自己维护的文件名
	 * @return
	 */
	@ResponseBody
	@RequestMapping(value = "/getTokenForAudio")
	public JSONObject A1_getToken_forAudio(HttpServletRequest request, HttpServletResponse response, final String type,
			final int chapterId, final int size, final int duration, final String info,String c_fileName) {
		final int uid = SCUser.getUidFromReq(request);
//		final int uid = (int)(Math.random()*100);
		JSONObject result_json = new JSONObject();//返回的json定义
		UserCoinsVo uc=userCoinsService.getUserCoinsById(uid);
		int ownLine=0;//当前上传总条数
		int ownSize=0;//当前上传总容量
		if(uc!=null){
			ownLine=uc.getTotalLine()+1;//计算本次上传后总条数
			ownSize=uc.getTotalSize()+size;//计算本次上传后总容量
		}
		zt.ta.function(); // 该账号上传总次数限制,上传总容量限制
		if(ownLine>SCSettingStaticName.EVERYONE_AUDIO_COUNTLINE||ownSize>SCSettingStaticName.EVERYONE_AUDIO_COUNTSIZE){
			result_json.put("code", "400");
			result_json.put("message", "该用户的上传空间已达最大，请删除以前记录后再尝试！");	
		}
		/*------------生成fileName-----------*/
		String s_fileName=uid+"/"+"audio/"+chapterId+"/"+System.currentTimeMillis()+"."+type;	
		String bucket=SCSettingStaticName.CLIENT_USERAUDIO_BUCKET;
		String localUrl=SCSettingStaticName.CLIENT_USERAUDIO_LOCALURL;
		zt.ts.function(); // 上传目录限制,上传文件数量和文件大小限制(查oss api)(绑定oss的javadoc)
		khb.ta.function();//文件大小的上传是根据章节的ID进行配置查询获得
				
		try {
			zt.tb.question(); // 获取全局唯一实例!考虑用Spring来创建和注入
			//ClientTokenConfig config = ClientTokenConfig.getInstance();

			zt.ts.question(); // roleSessionName应如何管理和使用?
			// RoleSessionName 是临时Token的会话名称，自己指定用于标识你的用户，主要用于审计，或者用于区分Token颁发给谁
			// 但是注意RoleSessionName的长度和规则，不要有空格，只能有'-' '_' 字母和数字等字符
			// 具体规则请参考API文档中的格式要求
			final String roleSessionName = "POST-"+uid+"-audio-"+chapterId;
			//返回数据中不仅需要按照policy的规则生成包含token，还需要增加filename，bucket，因此需要传递过去，生成
			final JSONObject aliResponseJson = clientTokenConfig.assumeRole(roleSessionName,s_fileName,size,bucket,c_fileName,localUrl);
			if (aliResponseJson != null && ((String) aliResponseJson.get("status")).equalsIgnoreCase("200")) {
				result_json.put("code", "200");
				result_json.put("message", "获取token成功");			
				zt.ts.function(); //生成一条记录,表示已给与上传权限,但尚未完成上传。(有可能存在垃圾文件)(查oss api)
				//创建当前用户当前上传基本情况，完成计数，和完成客户端有无反馈标识	
				UserToOSSAudioVo uTa=new UserToOSSAudioVo();
				uTa.setUid(uid);
				uTa.setLastFileName(s_fileName);
				uTa.setLastSize(size);
				uTa.setResult(0);
				userToOSSAudioService.saveUserToAudio(uTa);
			} else {
				result_json.put("code", "400");
				result_json.put("message", "获取token失败");
			}
			if (aliResponseJson != null) {
				result_json.put("data", aliResponseJson);
				zt.printDebug(aliResponseJson.toString(), zt.cs_oss调试);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result_json;
	}
	/**
	 * 用户准备上传图片,获取oss上传权限(允许客户端上传一个图片文件)
	 * 
	 * @param request
	 * @param response
	 * @param type
	 *            上传图片的类型(预留参数,目前总是传0)
	 * @param size
	 *            图片文件大小(单位:byte)
	 * @param info
	 *            预留扩展参数,目前总是传""	 
	 * @param c_fileName
	 *            客户端自己维护的文件名
	 * @return
	 */
	@ResponseBody
	@RequestMapping(value = "/getTokenForImage")
	public JSONObject A1_getToken_forImage(HttpServletRequest request, HttpServletResponse response, final String type,
			final int size,final String info,String c_fileName) {
		final int uid = SCUser.getUidFromReq(request);
		//final int uid = (int)(Math.random()*100);
		JSONObject result_json = new JSONObject();//返回的json定义
		UserCoinsVo uc=userCoinsService.getUserCoinsById(uid);
		int ownLine=0;//当前上传总条数
		int ownSize=0;//当前上传总容量
		if(uc!=null){
			ownLine=uc.getTotalLine()+1;//计算本次上传后总条数
			ownSize=uc.getTotalSize()+size;//计算本次上传后总容量
		}
		zt.ta.function(); // 该账号上传总次数限制,上传总容量限制
		if(ownLine>SCSettingStaticName.EVERYONE_AUDIO_COUNTLINE||ownSize>SCSettingStaticName.EVERYONE_AUDIO_COUNTSIZE){
			result_json.put("code", "400");
			result_json.put("message", "该用户的上传空间已达最大，请删除以前记录后再尝试！");	
		}
		/*------------生成fileName-----------*/
		String s_fileName=uid+"/"+"images/"+System.currentTimeMillis()+"."+type;	
		String bucket=SCSettingStaticName.CLIENT_USERIMAGE_BUCKET;
		String localUrl=SCSettingStaticName.CLIENT_USERIMAGE_LOCALURL;
		zt.ts.function(); // 上传目录限制,上传文件数量和文件大小限制(查oss api)(绑定oss的javadoc)
		khb.ta.function();//文件大小的上传是根据章节的ID进行配置查询获得
				
		try {
			zt.tb.question(); // 获取全局唯一实例!考虑用Spring来创建和注入
			//ClientTokenConfig config = ClientTokenConfig.getInstance();

			zt.ts.question(); // roleSessionName应如何管理和使用?
			// RoleSessionName 是临时Token的会话名称，自己指定用于标识你的用户，主要用于审计，或者用于区分Token颁发给谁
			// 但是注意RoleSessionName的长度和规则，不要有空格，只能有'-' '_' 字母和数字等字符
			// 具体规则请参考API文档中的格式要求
			final String roleSessionName = "POST-"+uid+"-image";
			//返回数据中不仅需要按照policy的规则生成包含token，还需要增加filename，bucket，因此需要传递过去，生成
			final JSONObject aliResponseJson = clientTokenConfig.assumeRole(roleSessionName,s_fileName,size,bucket,c_fileName,localUrl);
			if (aliResponseJson != null && ((String) aliResponseJson.get("status")).equalsIgnoreCase("200")) {
				result_json.put("code", "200");
				result_json.put("message", "获取token成功");			
				zt.ts.function(); //生成一条记录,表示已给与上传权限,但尚未完成上传。(有可能存在垃圾文件)(查oss api)
				//创建当前用户当前上传基本情况，完成计数，和完成客户端有无反馈标识	
				UserToOSSAudioVo uTa=new UserToOSSAudioVo();
				uTa.setUid(uid);
				uTa.setLastFileName(s_fileName);
				uTa.setLastSize(size);
				uTa.setResult(0);
				userToOSSAudioService.saveUserToAudio(uTa);
			} else {
				result_json.put("code", "400");
				result_json.put("message", "获取token失败");
			}
			if (aliResponseJson != null) {
				result_json.put("data", aliResponseJson);
				zt.printDebug(aliResponseJson.toString(), zt.cs_oss调试);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result_json;
	}
}
